package logic

import (
	"context"

	"goNutpi/internal/svc"
	"goNutpi/internal/types"

	_ "github.com/JohannesKaufmann/html-to-markdown/v2"
	"github.com/zeromicro/go-zero/core/logx"
)

type TestLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewTestLogic(ctx context.Context, svcCtx *svc.ServiceContext) *TestLogic {
	return &TestLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *TestLogic) Test() (resp *types.Response, err error) {
	// todo: add your logic here and delete this line
	//input := "<blockquote>\n <p>在开发一款影视APP时，首页的轮播图是一个非常重要的部分。它不仅能够吸引用户的注意力，还能有效地推广重点内容。为了提升应用的性能和用户体验，我们可以实现轮播图的懒加载功能。本文将详细介绍如何在HarmonyOS NEXT应用开发中实现这一功能。</p>\n</blockquote>\n<h2 id=\"1-数据源设计\">1. 数据源设计</h2>\n<p>开源仓库地址：<a href=\"https://atomgit.com/csdn-qq8864/hmmovie\" rel=\"nofollow\" linktype=\"\">https://atomgit.com/csdn-qq8864/hmmovie</a> <img src=\"https://i-blog.csdnimg.cn/direct/3eaff6b123f14d028b05a0e5b91783f5.png\" alt=\"在这里插入图片描述\"></p>\n<p>首先，我们需要设计一个数据源类 <code>BasicDataSource</code>，该类会实现 <code>IDataSource</code> 接口，用于管理轮播图数据。以下是 <code>BasicDataSource</code> 的代码：</p>\n<pre><code class=\"language-javascript\">class BasicDataSource&lt;T&gt; implements IDataSource {\n  private listeners: DataChangeListener[] = [];\n  private originDataArray: T[] = [];\n\n  totalCount(): number {\n    return this.originDataArray.length;\n  }\n\n  getData(index: number): T {\n    return this.originDataArray[index];\n  }\n\n  registerDataChangeListener(listener: DataChangeListener): void {\n    if (this.listeners.indexOf(listener) &lt; 0) {\n      this.listeners.push(listener);\n    }\n  }\n\n  unregisterDataChangeListener(listener: DataChangeListener): void {\n    const pos = this.listeners.indexOf(listener);\n    if (pos &gt;= 0) {\n      this.listeners.slice(pos, 1);\n    }\n  }\n\n  // 通知LazyForEach组件需要重新重载所有子组件\n  notifyDataReload(): void {\n    this.listeners.forEach(listener =&gt; {\n      listener.onDataReloaded();\n    })\n  }\n\n  // 通知LazyForEach组件需要在index对应索引处添加子组件\n  notifyDataAdd(index: number): void {\n    this.listeners.forEach(listener =&gt; {\n      listener.onDataAdd(index);\n    })\n  }\n}\n</code></pre>\n<h3 id=\"代码解释\">代码解释</h3>\n<ul>\n <li><strong>private listeners</strong>: 用于存储数据变化的监听器。</li>\n <li><strong>private originDataArray</strong>: 存储原始数据的数组。</li>\n <li><strong>totalCount</strong>: 返回数据源中数据的总数。</li>\n <li><strong>getData</strong>: 根据索引获取数据。</li>\n <li><strong>registerDataChangeListener</strong>: 注册数据变化监听器。</li>\n <li><strong>unregisterDataChangeListener</strong>: 移除数据变化监听器。</li>\n <li><strong>notifyDataReload</strong>: 通知所有监听器数据需要重新加载。</li>\n <li><strong>notifyDataAdd</strong>: 通知所有监听器在指定索引处添加了新数据。</li>\n</ul>\n<h2 id=\"2-扩展数据源以支持懒加载\">2. 扩展数据源以支持懒加载</h2>\n<p>接下来，我们需要扩展 <code>BasicDataSource</code> 类来实现轮播图数据的懒加载。这里我们创建一个 <code>SwiperDataSource</code> 类继承自 <code>BasicDataSource</code>，并添加了一些懒加载相关的功能：</p>\n<pre><code class=\"language-javascript\">class SwiperDataSource&lt;T&gt; extends BasicDataSource&lt;T&gt; {\n  private dataArray: T[] = [];\n\n  totalCount(): number {\n    return this.dataArray.length;\n  }\n\n  getData(index: number): T {\n    return this.dataArray[index];\n  }\n\n  // 在列表末尾添加数据并通知监听器\n  pushData(data: T): void {\n    this.dataArray.push(data);\n    this.notifyDataAdd(this.dataArray.length - 1);\n  }\n\n  // 重载数据\n  reloadData(): void {\n    // 不会引起状态变化\n    this.dataArray = [];\n    // 必须通过DataChangeListener来更新\n    this.notifyDataReload();\n  }\n}\n</code></pre>\n<h3 id=\"代码解释-1\">代码解释</h3>\n<ul>\n <li><strong>private dataArray</strong>: 存储懒加载后的数据。</li>\n <li><strong>pushData</strong>: 向数据数组中添加新数据，并通知监听器有新数据添加。</li>\n <li><strong>reloadData</strong>: 重置数据数组，并通知监听器数据需要重新加载。</li>\n</ul>\n<h2 id=\"3-实现轮播图懒加载\">3. 实现轮播图懒加载</h2>\n<p>在设计好数据源后，我们可以开始实现轮播图。使用 <code>Swiper</code> 和 <code>LazyForEach</code> 组件来实现懒加载。以下是首页轮播图的代码：</p>\n<pre><code class=\"language-javascript\">// 轮播图\nSwiper(this.swiperController) {\n  LazyForEach(this.swiperData, (item: SwiperItem) =&gt; {\n    Stack({ alignContent: Alignment.Center }) {\n      Image(item.imageUrl)\n        .width('100%')\n        .height(180)\n        .zIndex(1)\n        .onClick(() =&gt; {\n          this.pageStack.pushDestinationByName(\"MovieDetailPage\", { id:item.id }).catch((e:Error)=&gt;{\n            // 跳转失败，会返回错误码及错误信息\n            console.log(`catch exception: ${JSON.stringify(e)}`)\n          }).then(()=&gt;{\n            // 跳转成功\n          });\n        })\n\n      // 显示轮播图标题\n      Text(item.title)\n        .padding(5)\n        .margin({ top: 135 })\n        .width('100%')\n        .height(60)\n        .textAlign(TextAlign.Center)\n        .maxLines(2)\n        .textOverflow({ overflow: TextOverflow.Clip })\n        .fontSize(22)\n        .fontColor(Color.White)\n        .opacity(100)// 设置标题的透明度 不透明度设为100%，表示完全不透明\n        .backgroundColor('#808080AA')// 背景颜色设为透明\n        .zIndex(2)\n        .onClick(() =&gt; {\n          this.pageStack.pushDestinationByName(\"MovieDetailPage\", { id:item.id }).catch((e:Error)=&gt;{\n            // 跳转失败，会返回错误码及错误信息\n            console.log(`catch exception: ${JSON.stringify(e)}`)\n          }).then(()=&gt;{\n            // 跳转成功\n          });\n        })\n    }\n  }, (item: SwiperItem) =&gt; item.id)\n}\n.cachedCount(2)\n.index(1)\n.autoPlay(true)\n.interval(4000)\n.loop(true)\n.indicatorInteractive(true)\n.duration(1000)\n.itemSpace(0)\n.curve(Curve.Linear)\n.onChange((index: number) =&gt; {\n  console.info(index.toString())\n})\n.onGestureSwipe((index: number, extraInfo: SwiperAnimationEvent) =&gt; {\n  console.info(\"index: \" + index)\n  console.info(\"current offset: \" + extraInfo.currentOffset)\n})\n.height(180) // 设置高度\n</code></pre>\n<h3 id=\"代码解释-2\">代码解释</h3>\n<ul>\n <li><strong>Swiper</strong>: 轮播图组件，通过 <code>this.swiperController</code> 进行控制。</li>\n <li><strong>LazyForEach</strong>: 根据数据源动态渲染子组件。<code>this.swiperData</code> 是数据源实例，<code>(item: SwiperItem) =&gt; item.id</code> 是唯一标识符生成函数。</li>\n <li><strong>Stack</strong>: 容器组件，用于将图片和标题堆叠在一起。</li>\n <li><strong>Image</strong>: 显示轮播图的图片。</li>\n <li><strong>Text</strong>: 显示图片的标题，设置了最大行数、文字溢出处理、字体大小、颜色、背景颜色等属性。</li>\n <li><strong>cachedCount</strong>: 设置缓存的子组件数量。</li>\n <li><strong>index</strong>: 设置初始显示的图片索引。</li>\n <li><strong>autoPlay</strong>: 是否自动播放。</li>\n <li><strong>interval</strong>: 自动播放的时间间隔。</li>\n <li><strong>loop</strong>: 是否循环播放。</li>\n <li><strong>indicatorInteractive</strong>: 指示器是否可交互。</li>\n <li><strong>duration</strong>: 切换动画的持续时间。</li>\n <li><strong>itemSpace</strong>: 子组件之间的间距。</li>\n <li><strong>curve</strong>: 切换动画的曲线。</li>\n <li><strong>onChange</strong>: 当轮播图切换时触发的回调函数。</li>\n <li><strong>onGestureSwipe</strong>: 当用户进行滑动操作时触发的回调函数。</li>\n</ul>\n<h2 id=\"4-总结\">4. 总结</h2>\n<p>通过本文，我们学习了如何在HarmonyOS NEXT应用开发中实现轮播图的懒加载功能。这种方法不仅提升了应用的性能，还为用户提供了更好的使用体验。你可以根据实际需求对代码进行进一步的优化和扩展，以满足更多功能的实现。希望这篇文章对你有所帮助，欢迎在评论区交流和提问。</p>"

	//markdown, err := htmltomarkdown.ConvertString(input)
	//if err != nil {
	//	l.Error(err)
	//}
	//fmt.Println(markdown)
	_,err=l.svcCtx.TopicModel.GetUserRankingWithCache(l.ctx,20)
	if err != nil{
		l.Error(err)
	}
	//l.Debugf("#%v",result)
	return
}
